home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / dld-3_23.lha / dld-3.2.3 / test / general / main.c < prev    next >
C/C++ Source or Header  |  1991-05-30  |  2KB  |  105 lines

  1. #include <stdio.h>
  2. #include <strings.h>
  3. #include "dld.h"
  4.     
  5. int my_argc;
  6. char **my_argv;
  7.  
  8. /*
  9.  *  Ask for a object file interactively, then link it in.
  10.  *  User can then enter the function name for execution.
  11.  *  See file "script" for sample inputs.
  12.  */
  13. main (argc, argv)
  14. int argc;
  15. char **argv;
  16. {
  17.     char line[80];
  18.  
  19.     /* required initialization. */
  20.     (void) dld_init (argv[0]);
  21.     
  22.     my_argv = 0;
  23.     printf ("(dld) ");
  24.     while (gets(line) != NULL) {
  25.     printf ("%s\n", line);
  26.     if (my_argv) free (my_argv);
  27.     parse (line);
  28.     execute (my_argc, my_argv);
  29.     printf ("(dld) ");
  30.     }
  31. }
  32.  
  33. /* parse the user input.  Split the arguments into my_argv and put number
  34.    of arguments in my_argc, in the same way as the shell parse the command
  35.    line arguments. */
  36. parse (line)
  37. char line[];
  38. {
  39.     register char *p;
  40.  
  41.     my_argc = 0;
  42.     p = line;
  43.     while (*p) {
  44.     while (*p == '\t' || *p == ' ') p++;
  45.     if (!(*p)) break;
  46.     while (*p != '\t' && *p != ' ' && *p != 0) p++;
  47.     my_argc++;
  48.     if (*p) p++;
  49.     }
  50.  
  51.     my_argv = (char **) malloc ((my_argc+1) * sizeof (char **));
  52.     
  53.     {
  54.     register int i;
  55.     p = line;
  56.     for (i=0; i<my_argc; i++) {
  57.         while (*p == '\t' || *p == ' ') p++;
  58.         my_argv[i] = p;
  59.         while (*p != '\t' && *p != ' ' && *p != 0) p++;
  60.         *p = 0;
  61.         p++;
  62.     }
  63.     my_argv[my_argc] = 0;
  64.     }
  65. } /* parse */
  66.  
  67. /*
  68.  *  Carry out the user command:
  69.  *  dld object_file.o            -- dynamically link in that file.
  70.  *  ul object_file.o            -- unlink that file.
  71.  *  function_name arg1 arg2 ...        -- execute that function.
  72.  */
  73. execute (my_argc, my_argv)
  74. int my_argc;
  75. char **my_argv;
  76. {
  77.     register int (*func) ();
  78.     
  79.     if (!my_argc) return;
  80.     if (strcmp (my_argv[0], "dld") == 0)
  81.     while (--my_argc) {
  82.         register int dld_errno;
  83.         extern char *dld_errmesg;
  84.  
  85.         if (dld_link (*(++my_argv)))
  86.         dld_perror ("Can't link");
  87.     }
  88.     else if (!strcmp (my_argv[0], "ul"))
  89.     dld_unlink_by_file (my_argv[1], my_argc >= 3 ? 1 : 0);
  90.     else if (!strcmp (my_argv[0], "uls"))
  91.     dld_unlink_by_symbol (my_argv[1], my_argc >= 3 ? 1 : 0);
  92.     else {
  93.     func = (int (*) ()) dld_get_func (my_argv[0]);
  94.     if (func) {
  95.         register int i;
  96.         if (dld_function_executable_p (my_argv[0])) {
  97.         i = (*func) (my_argc, my_argv);
  98.         if (i) printf ("%d\n", i);
  99.         } else
  100.         printf ("Function %s not executable!\n", my_argv[0]);
  101.     }
  102.     else printf ("illegal command\n");
  103.     }
  104. }
  105.